﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Threading;
using System.Windows.Forms;

//Autor: Arturo Serna

namespace Librerias
{
    /// <summary>
    /// Clase que persiste los materiales
    /// </summary>
    public class CADMaterial
    {
        SqlConnection con;
        CADGestionDropbox drop ;
        
        /// <summary>
        /// Conecta con base de datos y DropBox
        /// </summary>
        public CADMaterial()
        {
            con = new SqlConnection(CADConexion.connString);


            drop = null;
            try
            {

                Thread th1 = new Thread(new ThreadStart(ConectarDropBox));
                th1.Start();
                th1.Join();
            }
            catch (Exception)
            {
                drop = null;
            }
        }

        /// <summary>
        /// Establece conexión con DropBox
        /// </summary>
        private void ConectarDropBox()
        {
            if (drop == null)
            {
                drop = new CADGestionDropbox();
            }
        }

        /// <summary>
        /// Crea una carpeta en dropbox y la escribe en la base de datos
        /// </summary>
        /// <param name="en"></param>
        /// <returns></returns>
        public int CrearCarpeta(ENMaterial en)
        {

            int res = -1;

            ConectarDropBox();

            if (drop.CreaDir(en.Ruta+en.Archivo.Replace("/","")))
            {
                try
                {
                    con.Open();

                    SqlCommand com = new SqlCommand("insert into material (matCorreo, matAsignatura, matTitulo, matArchivo, matRuta) values('" +
                                                        en.Correo + "','" +
                                                        en.Asignatura + "','" +
                                                        en.Titulo + "','" +
                                                        "/" + en.Archivo + "','" +
                                                        en.Ruta + "');", con);
                    res = com.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                finally
                {
                    con.Close();
                }
            }

            return res;
        }
        
        /// <summary>
        /// Sube un archivo a dropbox y lo escribe en la base de datos
        /// </summary>
        /// <param name="en"></param>
        /// <param name="barra"></param>
        public void SubirMaterial(ENMaterial en, ProgressBar barra) 
        {

            ConectarDropBox();

          //  if (drop.AccedeA(en.Ruta) && drop.Subir(en.Archivo))
            if (drop.Subir(en.Archivo,en.Ruta,barra))
            {
                try
                {
                    con.Open();

                    SqlCommand com = new SqlCommand("insert into material (matCorreo, matAsignatura, matTitulo, matDescripcion, matArchivo, matRuta) values('" +
                                                        en.Correo + "','" +
                                                        en.Asignatura + "','" +
                                                        en.Titulo + "','" +
                                                        en.Descripcion + "','" +
                                                        GetFicheroFromRuta(en.Archivo) + "','" +
                                                        en.Ruta + "');", con);

                    if (com.ExecuteNonQuery() == -1) throw new Exception("Error en el query");
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                finally
                {
                    con.Close();
                }
            }
        }

        /// <summary>
        /// Actualiza los datos de un material en la base de datos
        /// </summary>
        /// <param name="material"></param>
        public void ModificarMaterial(ENMaterial material)
        {
            try
            {
                con.Open();

                (new SqlCommand("update material set " +
                                "matTitulo='" + material.Titulo +
                                "',matDescripcion='" + material.Descripcion +
                                "' where matId=" + material.Id + ";", con)).ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }
        }

        /// <summary>
        /// Elimina un archivo o carpeta
        /// </summary>
        /// <param name="idMaterial"></param>
        /// <param name="archivo"></param>
        public void EliminarMaterial(string idMaterial, string archivo)
        {
            ConectarDropBox();

            if (drop.Borrar(archivo))
            {
                try
                {
                    con.Open();
                    (new SqlCommand("delete from material "+
                                    "where matId = " + idMaterial + 
                                    " or matRuta like '" + archivo+"/%'", con)).ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                finally
                {
                    con.Close();
                }
            }
        }



        /// <summary>
        /// Obtiene el nombre de un fichero a partir de su ruta windows
        /// Ej: C:\cosa.exe -> cosa.exe
        /// </summary>
        /// <param name="ruta"></param>
        /// <returns></returns>
        public static string GetFicheroFromRuta(string ruta)
        {
            string[] aux = ruta.Split('\\');

            if (aux.Length > 1) return aux[aux.Length - 1];
            else return "";

        }


        /// <summary>
        /// Obtiene de la base de datos el sistema de archivos de la carpeta seleccionada,
        /// teniendo en cuenta los criterios de búsqueda
        /// </summary>
        /// <param name="ruta"></param>
        /// <param name="cadena"></param>
        /// <param name="campo"></param>
        /// <returns></returns>
        public DataTable GetMateriales(string ruta, string cadena, string campo)
        {
            DataTable res = new DataTable();

            try
            {
                con.Open();
                string select = "select matArchivo, matRuta, matTitulo, matDescripcion, matId, matCorreo, matAsignatura" +
                                " from material where matRuta like '" + ruta + "%'" +
                                " and " + campo + " like '%" + cadena + "%'";

                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);

            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
        }

        /// <summary>
        /// Obtiene de la base de datos el sistema de archivos de la carpeta pasada por parámetros
        /// </summary>
        /// <param name="ruta"></param>
        /// <returns></returns>
        public DataTable GetMateriales(string ruta)
        {
            DataTable res = null;

            try
            {
                con.Open();
                string select = "select matArchivo, matRuta, matTitulo, matDescripcion, matId, matCorreo, matAsignatura from material where matRuta = '" + ruta + "'";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                res = new DataTable();
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
            //  DataTable res = drop.getElementos(asignatura);
            //   return res;
        }




        public DataTable GetMaterialesWebSegunAsignaturasAlumno(string alu)
        {
            DataTable res = null;

            try
            {
                con.Open();
                string select = "select distinct * from materialWeb, cursar where matAsignatura=curCodigo and curCorreo= '" + alu + "' order by curCodigo;";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                res = new DataTable();
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
            
        }

        public DataTable GetMaterialesWebSegunAsignaturasProfesor(string alu)
        {
            DataTable res = null;

            try
            {
                con.Open();
                string select = "SELECT DISTINCT materialWeb.matId, materialWeb.matCorreo, materialWeb.matAsignatura, materialWeb.matTitulo, materialWeb.matDescripcion, materialWeb.matRuta, materialWeb.matArchivo, turno.turCorreo, turno.turCodigo, COUNT(materialWeb.matId) AS Expr1 "+ 
                                "FROM         materialWeb CROSS JOIN turno "+
                                "WHERE     (materialWeb.matAsignatura = turno.turCodigo) AND (turno.turCorreo ='" + alu + "') " + 
"GROUP BY materialWeb.matId, materialWeb.matCorreo, materialWeb.matAsignatura, materialWeb.matTitulo, materialWeb.matDescripcion, materialWeb.matRuta, materialWeb.matArchivo, turno.turCorreo, turno.turCodigo "+
"ORDER BY turno.turCodigo";
                //string select = "select distinct * from materialWeb,turno where (matAsignatura=turCodigo) and (turCorreo= '" + alu + "') order by turCodigo";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                res = new DataTable();
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
           
        }


        public DataTable GetMaterialesWebSegunAsignaturas(string asig)
        {
            DataTable res = null;

            try
            {
                con.Open();
                string select = "select * from materialWeb where matAsignatura= '" + asig + "'";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                res = new DataTable();
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
        }

        public DataTable GetMaterialesSinRuta()
        {
            DataTable res = null;

            try
            {
                con.Open();
                string select = "select matArchivo, matRuta, matTitulo, matDescripcion, matId, matCorreo, matAsignatura from material";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                res = new DataTable();
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
            //  DataTable res = drop.getElementos(asignatura);
            //   return res;
        }


        public void SetArchivoWeb(int id, string ruta, string archivo)
        {
            SqlConnection c = new SqlConnection(CADConexion.connString);
            try
            {
                c.Open();
                SqlCommand com = new SqlCommand("update materialWeb set " +
                                              " matRuta='" + ruta + "', matArchivo='" + archivo +
                                            "' where (matId=" + id + ");", c);
                com.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                c.Close();
            }
        }



        //*************Enlaces dropbox*************\\

        /// <summary>
        /// Devuelve la ruta relativa en la que se encuentra DropBox
        /// </summary>
        /// <returns></returns>
        public string GetRuta()
        {
            ConectarDropBox();
            return drop.GetDir();
        }

        /// <summary>
        /// Accede a la ruta DropBox indicada
        /// </summary>
        /// <param name="ruta"></param>
        public void AccedeA(string ruta)
        {
            
            ConectarDropBox();
            drop.AccedeA(ruta);

        }

        /// <summary>
        /// Descarga el fichero seleccionado
        /// </summary>
        /// <param name="ruta"></param>
        /// <param name="salida"></param>
        /// <returns></returns>
        public bool Descargar(string ruta, string salida)
        {
            return drop.Descargar(ruta, salida);
        }

        public void SubirMaterialWeb(ENMaterial en)
        {       
                try
                {
                    con.Open();

                    SqlCommand com = new SqlCommand("insert into materialWeb (matCorreo, matAsignatura, matTitulo, matDescripcion, matArchivo, matRuta) values('" +
                                                        en.Correo + "','" +
                                                        en.Asignatura + "','" +
                                                        en.Titulo + "','" +
                                                        en.Descripcion + "','" +
                                                        en.Archivo + "','" +
                                                        en.Ruta + "');", con);

                    if (com.ExecuteNonQuery() == -1) throw new Exception("Error en el query");
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                finally
                {
                    con.Close();
                }
            
        }

        public DataTable dimeElUltimoMaterial(string autor)
        {
             DataTable res = null;

            try
            {
                con.Open();
                string select = "select matId "+
                                 "from materialWeb "+
                                 "where (matCorreo='"+autor+"') and " +
                                 "matId=(select max(matId) from materialWeb where (matCorreo='"+autor+"'));";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                res = new DataTable();
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
        }
       
    }
}
/*


        public DataTable GetMaterialesFromBD(string asignatura)
        {
            DataTable res = null;

            try
            {
                con.Open();
                string select = "select * from material where matAsignatura = " + asignatura;
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                res = new DataTable();
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
        }
*/